PIC−パソコン間シリアル通信 PIC受信テスト


パソコンからPICへ文字を送ってみよう!


<項目>通信ボーレートの選択
「シリアル通信機能」のSPBREGレジスタの解説項目で表3.SPBRGの設定値とボーレートを参照してください。例としてボーレートを9600bpsに設定します。表3−1の低速モードや、表3−2の高速モードがありますが、ここでは高速モードの9600bpsを選択します。クロック周波数が20MHzの場合は、低速モードより高速モードの方がエラーレートが小さいためです。したがって、高速モードの場合のSPBREGは、81Hに設定すればよいことが分かります。
(注)MicroChip社のデータシートは、SPBREGの設定表示は10進数(decimal)になっていますので注意してください。


<項目>TXSTAレジスタ(Bank1)の設定
「シリアル通信機能」の制御用レジスタの解説項目でTXSTAレジスタを参照してください。

TXSTAレジスタの内容の決定

ということで、TXSTA→B’00100100’ (24H)


<項目>RCSTAレジスタ(Bank0)の設定
「シリアル通信機能」の制御用レジスタの解説項目でRCSTAレジスタを参照してください。

RCSTAレジスタの内容の決定

ということで、RCSTA→B’10010000’ (90H)


<項目>ハード側の接続について
図1に示すように、PICの「RC6/TX」及び「RC7/RX」端子は、MAX232を介してRS232Cへ接続します。また、パソコンから送られてくるデータをPICが受信し、その文字コードをRBポートのLEDに表示するようにしました。

PICシリアル受信の動作テスト回路
図1.PICシリアル受信の動作テスト回路



<項目>シリアル受信動作の確認プログラム
図2にシリアル受信のフローチャートを示します。
プログラムの解説については、「プログラムの説明」の項をご参照ください。


シリアル受信プログラムフローチャート
シリアル受信プログラムフローチャート

図2.シリアル受信プログラム
フローチャート


(注)以下に示すプログラムには、ホームページ画面作成の都合上、空白として全角文字のスペースなどが挿入されています。したがって、下記プログラムリストをそのままコピーしてMPLABのソースファイルとされた場合には、エラーとなることがあります。

→ここをクリックして、下記のプログラムをダウンロードするようにしてください。
  <ダウンロードする>ファイル名:「rx.asm」 サイズ5.03kバイト

→ここをクリックして、下記のオブジェクトファイルをダウンロードするようにしてください。
  <ダウンロードする>ファイル名:「rx.hex」 サイズ435バイト

;***********************************************************
; シリアル受信動作チェックプログラム
; 1文字を受信し、その文字コードを LED 表示する
; 非同期式通信モード
; ボーレート 9600bps
; 8ビット・ノンパリティ
; 割り込みは使用しない
; 文字コードのLED 表示はPORTB
;***********************************************************
    LIST   P=PIC16F877
    INCLUDE  P16F877.INC
;(1)プロセッサの種別指定
;(2)インクルードファイルの指定
;***********************************************************
; 変数定義とレジスタ割付
;***********************************************************
COUNT EQU 20H
COUNT1 EQU 21H
COUNT2 EQU 22H
COUNT3 EQU 23H
COUNT4 EQU 24H

    ORG  0
;(3)ループカウンタ
;   ループカウンタ1
;   ループカウンタ2
;   ループカウンタ3
;   ループカウンタ4

;(4)プログラムの開始番地の指定
;***********************************************************
; 送受信モードの初期化
; (注)バンクの位置に注意
;***********************************************************
    BSF    STATUS,RP0
    MOVLW   B'10111111'
    MOVWF   TRISC
    CLRF   TRISB
    MOVLW   B'00100100'
    MOVWF   TXSTA
    MOVLW   81H
    MOVWF   SPBRG
    BCF    STATUS,RP0
    MOVLW   B'10010000'
    MOVWF   RCSTA
;(5)Bank 1 へ切替
;(6)RC7/RX(入力),RC6/TX(出力)
;(7)PORTC の設定
;(8)PORTB 全ポートを出力に設定
;(9)8BIT,送信許可,非同期,高速
;   TXSTA レジスタの設定
;(10)ボーレート 9600bps (20MHz:高速設定時)
;   SPBRG レジスタの設定
;(11)Bank 0 へ戻す
;(12)シリアル,8BIT,継続受信許可
;   RCSTA レジスタの設定
;***********************************************************
; メインプログラム(受信ルーチン)
;
; データを受信し、その文字コードを PORTB の LED に表示する。
; もし、受信エラーが発生したら、LEDを点滅させる。
;***********************************************************
    MOVLW   B'11111111'
    MOVWF   PORTB
    CALL   TIME1S
    MOVLW   B'00000000'
    MOVWF   PORTB

LPRCV
    BTFSS   PIR1,RCIF
    GOTO   LPRCV



    BTFSC   RCSTA,FERR
    GOTO   FRAME
    BTFSC   RCSTA,OERR
    GOTO   OVER


    MOVF   RCREG,W
    MOVWF   PORTB
    GOTO   LPRCV
;(13)11111111 を Wreg にロードする
;   PORTBへ出力(LEDを全点灯させ受信待ち)
;(14)1秒のウエイトを入れる
;(15)00000000 を Wreg にロードする
;   PORTBへWregのデータを出力(LEDの消灯)
;
;
;(16)USART 受信割り込みフラグビットのチェック
;   PIR1 レジスタの RCIF が「0」だったら
;   LPRCV ラベル間をループする
;
; ****** エラーチェック ******
;(17)フレーミングエラーのチェック(1:エラー,0:正常)
;   フレーミングエラー時 FRAME のラベルへジャンプする
;(18)オーバーランエラーのチェック(1:エラー,0:正常)
;   オーバーランエラー時 OVER のラベルへジャンプする
;
; ****** 受信データの格納 ******
;(19)RCREGレジスタから受信データを読み込む
;(20)PORTBへ出力(文字コードに相当するLEDを点灯させる)
;(21)受信繰り返し
;***********************************************************
; 受信エラー処理
;***********************************************************
FRAME
    MOVF RCREG,W
    MOVLW B'01010101'
    MOVWF PORTB
    CALL TIME1S
    MOVLW B'00000000'
    MOVWF PORTB
    CALL TIME1S
    GOTO FRAME

OVER
    BCF RCSTA,CREN
    BSF RCSTA,CREN
    MOVLW B'10101010'
    MOVWF PORTB
    CALL TIME1S
    MOVLW B'00000000'
    MOVWF PORTB
    CALL TIME1S
    GOTO OVER
;   <フレーミングエラー時の処理>(LEDを点滅させる)
;(22)ダミーの入力(RCREGをリードするとFERRがクリアされる)
;(23)01010101 を Wreg にロードする
;   PORTBへ出力(LEDを点灯させる)
;   1秒間ウエイト
;   00000000 を Wreg にロードする
;   PORTBへ出力(LEDを消灯させる)
;   1秒間ウエイト
;   点滅を繰り返す

;   <オーバーランエラー時の処理>(LEDを点滅させる)
;(24)OERRのリセット(ビットCREN のクリアによりクリアする)
;(25)連続受信を許可する
;(26)10101010 を Wreg にロードする
;   PORTBへ出力(LEDを点灯させる)
;   1秒間ウエイト
;   00000000 を Wreg にロードする
;   PORTBへ出力(LEDを消灯させる)
;   1秒間ウエイト
;   点滅を繰り返す
;***********************************************************
;遅延サブルーチン
;***********************************************************
;100μs遅延サブルーチン(20MHzクロック時)
;・・・・・別記プログラムリスト参照・・・・・
;
;10ms遅延サブルーチン(20MHzクロック時)
;・・・・・別記プログラムリスト参照・・・・・
;
;1s遅延サブルーチン(20MHzクロック時)
;・・・・・別記プログラムリスト参照・・・・・

    END
 

【プログラムの説明】ここがポイント
このプログラムについて、順を追って解説を加えておきましょう。


(1)プロセッサの種別指定
定義の仕方は「PROCESSOR」か「LIST」命令を使って設定します。ここで指定するプロセッサ名称は、パッケージの種類を示すサフィックス(最後の英記号の部分)は不要です。

   PROCESSOR  PIC16F877
    または
   LIST  P=PIC16F877

(2)標準ヘッダーファイルのインクルード
標準ヘッダーファイルとは、各プロセッサが持っているSFR(Special Function Register)をラベル(記号)で使える様にするため、ラベルとハードウェアの場所とを定義しているファイルです。標準ヘッダーファイルは 「プロセッサ名.INC」というファイル名で統一されて、MPLABのディレクトリに格納されています。従って、これのインクルード方法は下記のようにして行います。
一度、参考までに標準ヘッダーファイルの内容をエディタ等で見ておくことをお勧めします。

   INCLUDE    P16F877.INC
    または
   #INCLUDE   P16F877.INC

(3)変数定義とレジスタ割付
レジスタファイルアドレスを指定するときに、アドレス数値を直接指定することもできますが、数値だけでは間違いも多く、プログラム自身も分かりにくくなってしまいます。そこで、EQU命令などを使ってラベルを設定し変数を定義します。レジスタファイルアドレスは、7ビットあるので、00〜7Fまで最大128個のレジスタが指定できますが、実際に物理的に実装されて汎用的に使用できるレジスタ数はデバイスによって異なっていますので注意が必要です。
PIC16F877の汎用レジスタのアドレスは、20H〜7FH
となっていますので、20H以降のアドレスに割り付けます。

(4)プログラムの開始番地の指定
「ORG」はプログラムの開始番地を指定する擬似命令で、ORG以下の実際のプログラム命令が格納されるプログラムメモリ内の位置(アドレス)を指定します。

   ORG  0  ;0番地から格納することを示します。

コンピュータは一般に電源投入時やリセットをすると必ず0番地からスタートするようになっているので、0番地には必ず命令があることが必要です。

(5)Bank 1 へ切替
PICには各種の動作モードを設定するための Special Register と呼ばれるものが用意されています。PICを動作させるためには、まずこのSpecial Registerの設定から始めます。そしてそれらは全て、Register File と呼ぶメモリとして用意されています。その Register Fileは Bank0, Bank1, Bank2, Bank3 とよばれるアドレス空間をもっているため、多少アクセスの仕方が面倒です。つまりRESET後の通常はBank0となっているので、Bank1側のレジスタにアクセスするときはBankの切替えをしてからとなります。またBank0とBank1に同じ物があるときにはどちらでも同じ様に使えます。
Bank1へ切り替える方法ですが、「STATUS」レジスタにある2ビットのRP0、RP1を変えてBankを指定します。デフォルトは、Bank0です。表1にBankとRP1,RP0ビットとの関係を示します。Bank1へ切り替えるためには、RP0ビットを「1」にします。(RP1はデフォルトで「0」なので変える必要はない。)

 BSF    STATUS,RP0
「STATUS」レジスタのRP0ビットを「1」にする。

表1.BankとRP1,RP0ビットとの関係
Bank RP1 RP0


(6)RC7/RX(入力),RC6/TX(出力)
シリアル通信の入出力ポートとして、受信入力ポート(RC7/RX)と、送信出力ポート(RC6/TX)を使います。他のRCポートは使いませんので、とりあえず入力に設定しておきます。したがって、RC6のみ出力設定にします。
ということで、B’10111111’ (BFH)をWregにロードする。


(7)PORTC の設定
Wregの内容をTRISCレジスタに上書きする。


(8)PORTB 全ポートを出力に設定
TRISBレジスタを、CLRF(fレジスタをゼロクリアする命令)で出力設定とします。

 CLRF   TRISB
「TRISBレジスタをゼロクリアする。すなわち、PORTB全ポートを出力に設定する」
PORTBにはLEDが接続されており、文字データコードの確認のために、点灯するようにしています。


(9)8BIT,送信許可,非同期,高速,TXSTA レジスタの設定
「シリアル通信機能」の制御用レジスタの解説項目でTXSTAレジスタを参照してください。

TXSTAレジスタの内容

ということで、TXSTA→B’00100100’ (24H)


(10)ボーレート 9600bps (20MHz:高速設定時), SPBRG レジスタの設定
「シリアル通信機能」のSPBREGレジスタの解説項目で表3.SPBRGの設定値とボーレートを参照してください。ボーレートを9600bpsに設定します。表3−1の低速モードや、表3−2の高速モードがありますが、ここでは高速モードの9600bpsを選択します。クロック周波数が20MHzの場合は、低速モードより高速モードの方がエラーレートが小さいためです。したがって、高速モードの場合のSPBREGは、81Hに設定すればよいことが分かります。
(注)MicroChip社のデータシートは、SPBREGの設定表示は10進数(decimal)になっていますので注意してください。


(11)Bank 0 へ戻す
Bank1での設定が終了した後は、Bank0に戻しておきます。Bank1へ切り替えるためには、RP0ビットを「0」にします。(RP1はデフォルトで「0」なので変える必要はない。)

BCF    STATUS,RP0
「STATUS」レジスタのRP0ビットを「0」にする。すなわち、Bank0に戻す。」


(12)シリアル,8BIT,継続受信許可,RCSTA レジスタの設定
「シリアル通信機能」の制御用レジスタの解説項目でRCSTAレジスタを参照してください。

RCSTAレジスタの内容の決定

ということで、RCSTA→B’10010000’ (90H)


(13)11111111 を Wreg にロードし、
   PORTBへWregのデータを出力(LEDの全点灯)

ここで、レジスタの初期設定が終了し、受信状態に入ったことを確認するため、 PORTB の LED を全点灯させるようにします。

(14)1秒のウエイトを入れる
PORTB の LED の点灯時間を1秒間に設定します。ここでは、遅延サブルーチンを使っています。

(15)00000000 を Wreg にロードし、
    PORTBへWregのデータを出力(LEDの消灯)
点灯していたLEDを消灯させ、受信待ちの状態に入ったことを知らせます。


(16)USART 受信割り込みフラグビットのチェック(1:USART 受信バッファがフル, 0:空)
    受信バッファが空であれば LPRCV のラベル間を繰り返す

周辺機能の割り込みのフラグビットが割り当てられているPIR1レジスタのUSART 受信割り込みフラグビット(RCIF)の状態をチェックします。
USART受信バッファがフルであるとすると、RCIFが「1」となり、次の命令で分岐されます。
BTFSS   PIR1,RCIF
「PIR1」レジスタのRCIFビットが「1」だったら次の命令をスキップし、ループから抜けます。
GOTO   LPRCV
ただし、受信バッファが空の間は、「PIR1」レジスタのRCIFビットが「0」のままですので、LPRCVラベルへ戻ってループを繰り返します。


(17)フレーミングエラーのチェック(1:エラー,0:正常)
受信ステータスおよびコントロールレジスタであるRCSTAレジスタのフレーミングエラービット(FERR)の状態をチェックします。
BTFSC   RCSTA,FERR
「RCSTA」レジスタのFERRビットが正常の「0」だったら次の命令をスキップし、オーバーランエラーのチェックへ進みます。
GOTO   FRAME
フレーミングエラー時 FRAME のラベルへジャンプします。


(18)オーバーランエラーのチェック(1:エラー,0:正常)
受信ステータスおよびコントロールレジスタであるRCSTAレジスタのオーバーランエラービット(OERR)の状態をチェックします。
BTFSC   RCSTA,OERR
「RCSTA」レジスタのOERRビットが正常の「0」だったら次の命令をスキップし、受信データの格納へ進みます。
GOTO   OVER
オーバーランエラー時 OVERのラベルへジャンプします。


(19)RCREGレジスタから受信データを読み込む
RCREGレジスタ(受信データが格納されている)内容をWregへロードする。


(20)PORTBへ出力(文字コードに相当するLEDを点灯させる)
Wregに格納したデータを、PORTBへ出力します。
PORTBには、LEDが接続されており、文字コード相当のLEDが点灯します。


(21)受信繰り返し
一連の受信動作が終了したら、「LPRCV」ラベル間をループさせて次の文字を受信するようにします。


(22)ダミーの入力(RCREGをリードするとFERRがクリアされる)ここがポイント
<フレーミングエラー時の処理>
受信時にフレーミングエラーが発生した場合、フレーミングエラービットFREEが「1」となっています。
フレーミングエラービットをリセットする場合には、RCREGレジスタ(USART受信レジスタ)をWregにロードするというダミー命令を実行します。


(23)01010101 を Wreg にロードする 〜 点滅を繰り返す
フレーミングエラーが発生したことを確認するための例です。
ここでは、PORTBのLEDを「01010101」に設定して1秒間隔でLEDを点滅させる動作を繰り返します。


(24)OERRのリセット(ビットCREN のクリアによりクリアする)ここがポイント
<オーバーランエラー時の処理>

受信時にオーバーランエラーが発生した場合、オーバーランエラービットOERRが「1」となっています。
オーバーランエラービットをリセットする場合には、RCSTAレジスタ(受信ステータスおよびコントロールレジスタ)の連続受信イネーブルビット(CREN)をクリアすることにより、オーバーランエラービット(OERR)がクリアされます。


(25)連続受信を許可する
先のオーバーランエラー時の処理で連続受信イネーブルビット(CREN)がクリアされてしまっているので、元の「1」にセットして戻しておきます。


(26)10101010 を Wreg にロードする 〜 点滅を繰り返す
オーバーランエラーが発生したことを確認するための例です。
ここでは、PORTBのLEDを「10101010」に設定して1秒間隔でLEDを点滅させる動作を繰り返します。



<項目>シリアル受信動作の確認
PIC側ではリセット後に1秒間PortBのLEDが点灯します。ここで受信状態に入ったことを確認しておきます。次にAcknowrichを起動し、ボーレートを9600bpsに設定します。図3にパソコンからデータを送るときのAcknowrich表示画面を示します。図3(a)はテキストモード時、(b)はバイナリモード時です。

データを送るときのAcknowrich表示画面(テキストモード時)
図3(a).データを送るときのAcknowrich表示画面(テキストモード時)
データを送るときのAcknowrich表示画面(バイナリモード時)
図3(b).データを送るときのAcknowrich表示画面(バイナリモード時)

送信データ入力エリアから文字データを送信できます。データはTEXT/BINARYモードがありますが、TEXTモードで例として、[A]という文字を送信することにしました。(バイナリモード時では、[41]になります。)リターンキーによって送信されます。
PIC側が文字を受信すると図4のように、送られてきた文字コードに相当するLEDが点灯します。ここでは、RB6とRB0のビットが点灯しました。[A]の文字コードが41Hであることがわかります。受信プログラムはループになっていますので、繰り返し別の文字を受信することができます。表2にキャラクタコードを載せておきました。

文字コード[A]に相当するLED点灯の様子
図4.文字コード[A]に相当する
LED点灯の様子



<項目>キャラクタコードについて
8ビット版で、0xA1〜0xDFにカタカナ(半角1バイト)を割り当てています。0x80〜0xA0,0xE0〜0xFFはJISでは未定義となっています。

キャラクタコード表キャラクタコード表を見る



<戻る> <次ページへ>
<TOPページへ>



テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル